数据结构(二) 字符串的常规使用

虽然字符串简单,但是在生活中的用处确实很广,就像论文查重,文章检索,没有字符串的数据结构和算法是实现不了的

我在这先放上c语言版的char数组,文章的下篇将介绍c++版的(唉,这两天感觉自己特别能得吧了)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
    #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>

//简单点说字符串就是字符数组
//基本运算无非就是长度 比较 回文 模式匹配(查找)
//模式匹配和回文我将会单独开文章的,请耐心等等吧 = =


//1.求字符串的长度 这里用到strlen函数
//那为什么不用sizeof(str)/sizeof(char) 计算呢?
//原因是开辟了1024个长度不一定用满,用sizeof计算呢即为1024,而非字符串长度
int str_length(char *s)
{
return strlen(s);//直接用strlen求解
}

//2.字符串比较 就是挨个比较字符串的字符
//可以用strcmp函数比较 也可以自己手写一个
int str_comparison_system(char *p,char *q)//函数意思为调用系统函数
{
//返回1 即p大 0即一样大小 -1即q大
return strcmp(p,q);
}

int str_comparison_user(char *p,char *q)//这个比较函数为自己写的
{
//先求出各自的长度 遍历长度最小的字符串比较,防止越界
//这是作者自己想到的,有什么好的想法欢迎来补充
//如果面试提到的话,自己可以借鉴一下
int lenp=str_length(p);
int lenq=str_length(q);
int theMin=lenp>lenq?lenq:lenp;//求出最短的长度

for(int i=0;i<theMin;++i)
{
if(p[i]==q[i]) continue;
if(p[i]>q[i]) return 1;
if(p[i]<q[i]) return -1;
}
return lenp>lenq?1:0;//这里的做法是为了防止p的前面与q一致,但是p后面有字符
//EG:abcdefg > abcd
}

int main()
{
char str1[1024]="hello world";//c语言中我们用char数组表示字符串
char str2[500]="hello friends";

printf("str1的长度:%d str2的长度:%d\n",str_length(str1),
str_length(str2));

//测试一下sizeof的区别
printf("str1的空间:%d\n",sizeof(str1)/sizeof(char));//输出1024

//字符串系统和自己写的比较
printf("系统函数 比较结果:%d\n",str_comparison_system(str1,str2));
printf("自己写函数 比较结果:%d\n",str_comparison_user(str1,str2));

//小福利 送上汇编写的 memory 内存函数的使用

memset(str2,0,sizeof(str2));//内存设置 一般把数组清0用
/*
参数一是你要设置的数组首地址
参数二是字节填充大小 注意int是占8或4个字节全填上1的话 结果就肯定不是1了
参数三是你要填的字节长度
*/
puts(str2);

memcpy(str2,str1,sizeof(str2));//内存拷贝
// 与strcpy(str2,str1);大同小异 但实际上mem的效率是大于strcpy的
//参数一看就懂了 把str1拷贝给str2 但是最后的参数一定是谁短写谁,否则炸内存

puts(str2);
puts(str1);
return 0;
}


c++版的string 数据类型

#include <iostream>
#include <string>
using namespace std;

int main()
{
string str1="hello world";
string str2="hello friends";
//哎 是不是有疑问了?不用考虑字串的空间大小么?
//这里我解释:程序运行实在操作系统的堆上运行的,线程实在栈上运行的
//既然实在堆上运行的,就看你电脑内存了,所以你就可以不用管了
//string 可以用[] 下标访问

// string 的输入两种方式 空格能输入和不能输入

//接收空格的字符串输入
// getline(cin,str1);//意思就是接收一行 回车生效

//不能接收空格的输入
// cin>>str1;

//求字符串的长度 string.length()
cout<<"str1的长度为"<<str1.length()<<endl;

//字符串比较 直接用 <、== 或 > 判断就行了
cout<<(str1>str2)<<endl;

//子串

string sub=str1.substr(5,3);//从5的位置截取3个长度 wo

cout<<sub<<endl;

//查找 时间效率为O(nlog(n)) 原理就是用的模式匹配
int flag=str1.find("lyf");//找不到返回-1 找到返回下标
cout<<flag<<endl;

//删除 n个 和 全部
str1.erase(3,4);//从3的位置删除4个
cout<<str1<<endl;
str1.clear();//全部删除
cout<<str1<<endl;

//加法 连接运算符
cout<<(str1+str2)<<endl;
return 0;
}